package properties;

import java.util.ArrayList;
import java.util.List;

import properties.Carry;
import properties.Letter;

import es.deusto.ingenieria.is.csp.formulation.Constraint;
import es.deusto.ingenieria.is.csp.formulation.Variable;

public class AdittionConstraint extends Constraint<Integer>{

	ArrayList<Integer> leftSide;
	private int result;
	private int carry;
	private int sum;

	public AdittionConstraint(String arg0, List<Variable<Integer>> arg1) {
		super(arg0, arg1);
	}

	@Override
	public boolean isSatisfied(Variable<Integer> arg0, Integer arg1) {
				if(arg0 instanceof Carry){
					if(((Carry)arg0).getName().equals(this.getName())){
						carry = arg1;
					}else{
						sum = arg1;
					}
					for (Variable<Integer> varAux : this.getVariables()) {
						if(varAux instanceof Letter){
							int varPosition = ((Letter)varAux).havePosition(Integer.parseInt(this.getName()));
							if (!((Letter)varAux).getResult().get(varPosition) && varAux.hasValue()) {
								sum = sum + varAux.getValue();
							}else if(((Letter)varAux).getResult().get(varPosition) && varAux.hasValue()){
								result = varAux.getValue();
							}
						}else if(varAux.getName().equals(this.getName()) && varAux instanceof Carry && varAux.hasValue()){
							carry = varAux.getValue();
						}else if(Integer.parseInt(varAux.getName())==Integer.parseInt(this.getName())+1 && varAux instanceof Carry && varAux.hasValue()){
							sum = sum + varAux.getValue();
						}
					}if(sum != result+(10*carry)){
						return false;
					}
				}else{
					int position = ((Letter)arg0).havePosition(Integer.parseInt(this.getName()));
					if(((Letter)arg0).getResult().get(position)){
						result = arg1;
					}else{
						sum = arg1;
					}for (Variable<Integer> varAux : this.getVariables()) {
						if(varAux instanceof Letter){
							int varPosition = ((Letter)varAux).havePosition(Integer.parseInt(this.getName()));
							if (!((Letter)varAux).getResult().get(varPosition) && varAux.hasValue()) {
								sum = sum + varAux.getValue();
							}else if(((Letter)varAux).getResult().get(varPosition) && varAux.hasValue()){
								result = varAux.getValue();
							}
						}else if(varAux.getName().equals(this.getName()) && varAux instanceof Carry && varAux.hasValue()){
							carry = varAux.getValue();
						}else if(Integer.parseInt(varAux.getName())==Integer.parseInt(this.getName())+1 && varAux instanceof Carry && varAux.hasValue()){
							sum = sum + varAux.getValue();
						}	
					}if(sum != result+(10*carry)){
						return false;
					}
				}
				return true;
			}
		}